﻿using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Business.AID;
using Data.AID;
using System.Collections.Generic;
using Microsoft.SharePoint;
using System.Linq;
using Business.AID.Extensions;

namespace Presentation.AID.WebPart.Presentation.AID.VWPAuditoriaValidacao
{
    public partial class VWPAuditoriaValidacaoUserControl : UserControl
    {

        #region Propriedades

        private int IdFormulario
        {
            get
            {
                object obj = Request.QueryString["IdForm"];
                return (obj != null) ? Convert.ToInt32(obj) : 0;
            }
        }
        private string AIDEmail
        {
            get { return Dados.AIDEmail; }
        }
        private int IdColaborador
        {
            get 
            {
                return (int)ViewState["ColaboradorID"];
            }
            set
            {
                ViewState["ColaboradorID"] = value;
            }
        }
        
        #endregion

        protected void Page_PreRender(object sender, EventArgs e) 
        {
            ColaboradorBO colaboradorBO = new ColaboradorBO();
            Colaborador colaborador = colaboradorBO.GetEmployeeByLogin(SPContext.Current.Web.CurrentUser.LoginName);

            if (colaborador == null) 
            {
                throw new ArgumentNullException("Colaborador não encontrado. VWPAuditoriaValidacao");
            }

            if (!colaborador.Funcao.Contains("Coordenador de Auditoria")) 
            {
                gdvMetasValidar.Enabled = false;
                btnEnviar.Enabled = false;
                divMsgError.InnerHtml = "<span>Somente o coordenador de auditoria poder validar um formulário.</span>";
            }

        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack) 
            {
                Formulario form = RetornaColaborador(IdFormulario);
                if (form == null) 
                {
                    throw new ArgumentNullException("Formulario não encontrado.");
                }

                PreencheCabecalho(form);

                List<Meta> metas = RetornaMetas(form.Id);
                gdvMetasValidar.DataSource = metas;
                gdvMetasValidar.DataBind();

            }
        }

        #region Métodos

        private void SetGoalApproval(GridView gridview)
        {
            foreach (GridViewRow row in gridview.Rows)
            {
                DataKey dtKey = gridview.DataKeys[row.RowIndex];

                int _idMeta = Convert.ToInt32(dtKey["ID"]);
                RadioButtonList rbSelected = row.FindControl("radioList") as RadioButtonList;

                string nome = rbSelected.SelectedValue;
                Boolean SelectedValue = Convert.ToBoolean(rbSelected.SelectedValue);

                string aprovacao = "";
                if (SelectedValue == true)
                {
                    aprovacao = "Aprovado";
                }
                else
                {
                    aprovacao = "Devolvido";
                }

                Meta meta = new Meta()
                {
                    Id = _idMeta,
                    Aprovacao = aprovacao,
                    ConsideracaoFeita = false
                };

                MetaBO metaBO = new MetaBO();
                metaBO.SetGoalApproval(meta);
            }
        }
        private Formulario RetornaColaborador(int idForm)
        {
            FormularioBO formBO = new FormularioBO();
            return formBO.GetFormById(idForm);
        }
        private List<Meta> RetornaMetas(int idForm)
        {
            MetaBO metaBO = new MetaBO();
            return metaBO.GetAllGoalsByForm(idForm);
        }
        private void PreencheCabecalho(Formulario form)
        {
            try
            {
                txtMatricula.Text = form.Matricula;
                txtNome.Text = form.Nome;
                txtFuncao.Text = form.Funcao.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[1];
                txtDtAdmissao.Text = form.DtAdmissao.ToString();
                txtArea.Text = form.Area.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[1]; ;
                txtGestorImediato.Text = form.GestorImediato.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[1];

                IdColaborador = form.IdColaborador;
            }
            catch (Exception ex)
            {
                throw new Exception("Erro ao carregar o cabeçalho." + ex.Message);
            }
        }
        private void EnviarFormulario(Categoria categoriaAtual, int IdProxEstagio, bool Aprovacao)
        {
            SetGoalApproval(gdvMetasValidar);

            int acaoID;
            if (Aprovacao) { acaoID = 1; }
            else { acaoID = 2; }

            Categoria proxEstagio = new CategoriaBO().GetCategoryById(IdProxEstagio);

            if (proxEstagio == null)
            {
                throw new ArgumentNullException("Categoria não encontrada. VWPAuditoriaValidação.");
            }

            Formulario formulario = new Formulario()
            {
                Id = IdFormulario,
                AprovacaoGestor = Aprovacao,
                AprovacaoAuditoria = Aprovacao
            };

            FormularioBO formularioBO = new FormularioBO();
            formularioBO.SetFormStage(IdFormulario, proxEstagio.IdCategoria);
            formularioBO.SetAuditApproval(formulario);

            Historico historico = new Historico()
            {
                IdFormulario = IdFormulario,
                Origem = categoriaAtual.IdCategoria.ToString(),
                Destino = proxEstagio.IdCategoria.ToString(),
                AcaoId = acaoID
            };

            HistoricoBO historicoBO = new HistoricoBO();
            historicoBO.CreateHistory(historico);

        }
        private Boolean isRadioButtonCheckedValue(GridView gridview, string value)
        {
            foreach (GridViewRow row in gridview.Rows)
            {
                RadioButtonList rbSelected = row.FindControl("radioList") as RadioButtonList;

                string _value = rbSelected.SelectedValue;

                if (value == _value)
                {
                    return false;
                }
            }
            return true;
        }
        private void DefineRadioButtonList(GridViewRowEventArgs e)
        {
            int RowIndex = e.Row.RowIndex;
            DataKey dtKey = gdvMetasValidar.DataKeys[RowIndex];
            int metaID;
            int.TryParse(dtKey["ID"].ToString(), out metaID);

            MetaBO metaBO = new MetaBO();
            Meta meta = metaBO.GetGoalById(metaID);

            if (meta != null)
            {
                RadioButtonList radioButtonList = (RadioButtonList)e.Row.FindControl("radioList");
                string findByValue = meta.Aprovacao.ToString();

                if (findByValue == "Aprovado") { findByValue = "true"; }
                if (findByValue == "Devolvido") { findByValue = "false"; }

                try
                {
                    radioButtonList.Items.FindByValue(findByValue).Selected = true;
                }
                catch (Exception ex)
                {
                    radioButtonList.Items.FindByValue("false").Selected = true;
                }
            }
        }
        private static void LimitaCaracteres(GridViewRowEventArgs e)
        {
            string descricao = e.Row.Cells[0].Text;
            if (descricao.Length > 200)
            {
                e.Row.Cells[0].Text = descricao.Substring(0, 200) + "...";
            }

            string ferramentaMedicao = e.Row.Cells[1].Text;
            if (ferramentaMedicao.Length > 200)
            {
                e.Row.Cells[1].Text = ferramentaMedicao.Substring(0, 200) + "...";
            }
        }
        
        #endregion

        #region Eventos

        protected void gdvMetasValidar_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow) 
            {
                LimitaCaracteres(e);
                DefineRadioButtonList(e);
            }
        }
        protected void btnEnviar_Click(object sender, EventArgs e)
        {
            CategoriaBO categoriaBO = new CategoriaBO();
            Categoria categoria = categoriaBO.GetCategoryById(5);

            FormularioBO formularioBO = new FormularioBO();
            bool isAlreadyApproved = formularioBO.isAlreadyApproved(IdFormulario, categoria.IdCategoria);

            if (!isAlreadyApproved)
            {
                bool valueChecked = isRadioButtonCheckedValue(gdvMetasValidar, "false");

                if (valueChecked)
                {
                    EnviarFormulario(categoria, 1, true);
                }
                else
                {
                    EnviarFormulario(categoria, 4, false);
                    ColaboradorBO colaboradorBO = new ColaboradorBO();
                    Colaborador colaborador = colaboradorBO.GetEmployeeById(IdColaborador);

                    if (colaborador != null)
                    {
                        string urlDevolucao = String.Format(@"{0}SitePages/MinhasMetas.aspx?f={1}", Dados.UriAID, IdFormulario);
                        string mensagem = String.Format(@"<p>Sua AID foi devolvida para ajustes. Para prosseguir, acesse o sistema ou <a href='{0}'>Clique aqui.</a></p>", urlDevolucao);
                        MailUtility.EnviarEmail(AIDEmail, colaborador.Email, "smtp.abdi.com.br", mensagem);
                    }
                    
                }

                Response.Redirect(@"/SitePages/ConsultarMetaAuditoria.aspx");
            }
        }
        protected void gdvMetasValidar_DataBound(object sender, EventArgs e)
        {
            MetaBO metaBO = new MetaBO();
            List<Meta> ListaMeta = metaBO.GetAllGoalsByForm(IdFormulario);

            if (ListaMeta.Count > 0)
            {
                GridViewRow footerRow = gdvMetasValidar.FooterRow;

                footerRow.Cells[0].Text = "Valor:";
                footerRow.Cells[2].Text = ListaMeta.Sum(p => p.Peso).ToString() + "%";
            }
        }
        
        #endregion

    }
}
